{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# microsoftml Quickstart: Breast Cancer Prediction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "This quickstart is a simple example to show the use of the rx_fast_linear function to build a binary classifier model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Load the breast cancer data \n",
    "We'll be using the breast cancer dataset that is built into scikit-learn. We will then use pandas and numpy to convert the data to a dataframe so that we can take a look at the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean radius</th>\n",
       "      <th>mean texture</th>\n",
       "      <th>mean perimeter</th>\n",
       "      <th>mean area</th>\n",
       "      <th>mean smoothness</th>\n",
       "      <th>mean compactness</th>\n",
       "      <th>mean concavity</th>\n",
       "      <th>mean concave points</th>\n",
       "      <th>mean symmetry</th>\n",
       "      <th>mean fractal dimension</th>\n",
       "      <th>...</th>\n",
       "      <th>worst texture</th>\n",
       "      <th>worst perimeter</th>\n",
       "      <th>worst area</th>\n",
       "      <th>worst smoothness</th>\n",
       "      <th>worst compactness</th>\n",
       "      <th>worst concavity</th>\n",
       "      <th>worst concave points</th>\n",
       "      <th>worst symmetry</th>\n",
       "      <th>worst fractal dimension</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0.2419</td>\n",
       "      <td>0.07871</td>\n",
       "      <td>...</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0.1812</td>\n",
       "      <td>0.05667</td>\n",
       "      <td>...</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0.2069</td>\n",
       "      <td>0.05999</td>\n",
       "      <td>...</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0.2597</td>\n",
       "      <td>0.09744</td>\n",
       "      <td>...</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0.1809</td>\n",
       "      <td>0.05883</td>\n",
       "      <td>...</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean radius  mean texture  mean perimeter  mean area  mean smoothness  \\\n",
       "0        17.99         10.38          122.80     1001.0          0.11840   \n",
       "1        20.57         17.77          132.90     1326.0          0.08474   \n",
       "2        19.69         21.25          130.00     1203.0          0.10960   \n",
       "3        11.42         20.38           77.58      386.1          0.14250   \n",
       "4        20.29         14.34          135.10     1297.0          0.10030   \n",
       "\n",
       "   mean compactness  mean concavity  mean concave points  mean symmetry  \\\n",
       "0           0.27760          0.3001              0.14710         0.2419   \n",
       "1           0.07864          0.0869              0.07017         0.1812   \n",
       "2           0.15990          0.1974              0.12790         0.2069   \n",
       "3           0.28390          0.2414              0.10520         0.2597   \n",
       "4           0.13280          0.1980              0.10430         0.1809   \n",
       "\n",
       "   mean fractal dimension   ...    worst texture  worst perimeter  worst area  \\\n",
       "0                 0.07871   ...            17.33           184.60      2019.0   \n",
       "1                 0.05667   ...            23.41           158.80      1956.0   \n",
       "2                 0.05999   ...            25.53           152.50      1709.0   \n",
       "3                 0.09744   ...            26.50            98.87       567.7   \n",
       "4                 0.05883   ...            16.67           152.20      1575.0   \n",
       "\n",
       "   worst smoothness  worst compactness  worst concavity  worst concave points  \\\n",
       "0            0.1622             0.6656           0.7119                0.2654   \n",
       "1            0.1238             0.1866           0.2416                0.1860   \n",
       "2            0.1444             0.4245           0.4504                0.2430   \n",
       "3            0.2098             0.8663           0.6869                0.2575   \n",
       "4            0.1374             0.2050           0.4000                0.1625   \n",
       "\n",
       "   worst symmetry  worst fractal dimension  target  \n",
       "0          0.4601                  0.11890     0.0  \n",
       "1          0.2750                  0.08902     0.0  \n",
       "2          0.3613                  0.08758     0.0  \n",
       "3          0.6638                  0.17300     0.0  \n",
       "4          0.2364                  0.07678     0.0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "bc = load_breast_cancer()\n",
    "\n",
    "bc_df = pd.DataFrame(data = np.c_[bc['data'], bc['target']],\n",
    "                     columns = bc['feature_names'].tolist() + ['target'])\n",
    "\n",
    "bc_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Split the data into a train and test dataset\n",
    "We will now split the data into 2 datasets. A train dataset to train the model, and a test dataset to gauge how good is  the model. We'll use 80% of the data for the train dataset and 20% for the test dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# of rows in training set =  14105\n",
      "# of rows in test set =  3534\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "bc_train, bc_test = train_test_split(bc_df, test_size=0.2)\n",
    "\n",
    "print(\"# of rows in training set = \",bc_train.size)\n",
    "print(\"# of rows in test set = \",bc_test.size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 3. Train a binary classifier model\n",
    "Now that we have the dataset to train with, we'll train a model using that data. We will be using the [rx_fast_linear](https://docs.microsoft.com/en-us/r-server/python-reference/microsoftml/rx-fast-linear) function from the [microsoftml](https://docs.microsoft.com/en-us/r-server/python-reference/microsoftml/microsoftml-package) package to train the model. \n",
    "\n",
    "The first parameter to the rx_fast_linear function specifies the target label followed by the features to train the model. This is known as the *formula* and has the format of \"a ~ [b]\" where \"a\" is the column name of the target and \"[b]\" is the list of feature columns to train with.\n",
    "\n",
    "In this example, we create list of columns from the training dataset by taking all columns but dropping the target column (called \"target\" in this case)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Express Edition will continue to be enforced.\n",
      "Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.\n",
      "Beginning processing data.\n",
      "Rows Read: 455, Read Time: 0, Transform Time: 0\n",
      "Beginning processing data.\n",
      "Beginning processing data.\n",
      "Rows Read: 455, Read Time: 0.001, Transform Time: 0\n",
      "Beginning processing data.\n",
      "Beginning processing data.\n",
      "Rows Read: 455, Read Time: 0.001, Transform Time: 0\n",
      "Beginning processing data.\n",
      "Using 2 threads to train.\n",
      "Automatically choosing a check frequency of 2.\n",
      "Auto-tuning parameters: maxIterations = 3294.\n",
      "Auto-tuning parameters: L2 = 2.670477E-05.\n",
      "Auto-tuning parameters: L1Threshold (L1/L2) = 0.\n",
      "Using best model from iteration 368.\n",
      "Not training a calibrator because it is not needed.\n",
      "Elapsed time: 00:00:06.1734881\n",
      "Elapsed time: 00:00:00.4967690\n"
     ]
    }
   ],
   "source": [
    "from microsoftml import rx_fast_linear\n",
    "\n",
    "features = bc_df.columns.drop([\"target\"])\n",
    "model = rx_fast_linear(\"target ~ \" + \"+\".join(features), data=bc_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Predict using the trained model\n",
    "At this point we have a model that we have trained on the training data, using the rx_fast_linear binary classification algorithm. Let's now use that model to predict using the [rx_predict](https://docs.microsoft.com/en-us/r-server/python-reference/microsoftml/rx-predict), based on the test dataset. \n",
    "\n",
    "We will also take a look at the return result of rx_predict function. The *PredictedLabel* column indicates whether the data represents a cancerous sample or not. The *Probability* column indicates the confidence of the prediction for that particular row of data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Beginning processing data.\n",
      "Rows Read: 114, Read Time: 0.001, Transform Time: 0\n",
      "Beginning processing data.\n",
      "Elapsed time: 00:00:00.6729840\n",
      "Finished writing 114 rows.\n",
      "Writing completed.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PredictedLabel</th>\n",
       "      <th>Score</th>\n",
       "      <th>Probability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>6.273149</td>\n",
       "      <td>9.981173e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>-17.446648</td>\n",
       "      <td>2.648605e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>True</td>\n",
       "      <td>5.057464</td>\n",
       "      <td>9.936786e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>1.958880</td>\n",
       "      <td>8.764117e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>-2.303647</td>\n",
       "      <td>9.082136e-02</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  PredictedLabel      Score   Probability\n",
       "0           True   6.273149  9.981173e-01\n",
       "1          False -17.446648  2.648605e-08\n",
       "2           True   5.057464  9.936786e-01\n",
       "3           True   1.958880  8.764117e-01\n",
       "4          False  -2.303647  9.082136e-02"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from microsoftml import rx_predict\n",
    "\n",
    "prediction = rx_predict(model, data=bc_test)\n",
    "\n",
    "prediction.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Evaluating the model\n",
    "Let's now gauge the quality of the model we have. A standard metric to use is the AUC (Area Under the Curve) metric. Assuming no overfiiting of the model has taken place, the closer the value of the AUC is to 1, the better the quality of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.960526315789\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import roc_curve, auc\n",
    "fpr, tpr, thresholds = roc_curve(bc_test[\"target\"], prediction[\"PredictedLabel\"])\n",
    "\n",
    "roc_auc = auc(fpr, tpr)\n",
    "print(roc_auc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also look at the ROC (Receiver Operating Characteristics) curve to visually see the performance of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nmfn6dNXTBRdcwLp168jIyMg8Q8+OiNC1a1cGDBhA3bp1M8+M27dvz3vvvZe53PLly896b926ddm8\neXPm66NHj2YehMeMGZPjNjt06MDo0aMz21B27tzJvn37OHr0KGXKlCEmJob169ezYMGCbN//9ttv\ns3z58rMeWZMEOO0I48aNIyUlha1bt7Jp0yZatGhx1nL79jm9TWRkZDB06FB69+6dGeuqVas4efIk\naWlpzJo1i3r16gFOwtuzZw/Vq1fP8bP6Sggmivy1Ucyd+wdNm37AwIEzSUpK48SJVNLTMwC7KcoU\nDU2bNqVRo0Z88cUXREdH8+233zJ06FDq1KlDw4YNufzyy+nbty8AjRo14p133uGuu+6ibt26NGjQ\ngC1btpy1zsGDB3P48GEaNGhA48aNM8+0X331VW666SauvPJKKlXK/STszjvv5PPPP8+sdgIYPnw4\nS5YsoVGjRtSrVy/bJBUfH8/Ro0c5fvw4AM888wzPPfccTZs2JS0tLcfttW/fnrvvvjvzctQ77riD\n48eP07FjR9LS0qhbty4DBw48o20hv+rXr0+3bt2oV68eHTt2ZOTIkZnVbg8++CBLliwB4IsvvuDS\nSy8lPj6eypUr06tXL8CpyhswYACXX345TZo04bLLLqNz584ALF26lJYtWxIR4f+KIVENTN1pfjW/\nSHTJ48DjKRDu3Whx7767gMcfd65frlmzDKNGdaJDB+vAz/jXunXrqFu3bqDDKNTefvtt4uLiePDB\nBwMdSoHr378/Xbp0yayG8pTdd09Elqpq8/xsK/RKFABRZfJMEqpKYuIpADp2rEVsbHEGD76a1asf\nsSRhTCHxyCOPEBlZNC8+adCgQbZJwh9CrzEb8ryHYv36A/TuPYly5WL45ptu1KlTnu3bn6B0aRuO\n1JjCJCoqip49ewY6jID4v//7vwLbVogmiuzbJ5KSUnnllTm89tovpKZmUL58DLt3H6dSpThLEiYg\n1B0i15iC4o/mhEKTKJYs2UX37l/z22/OVRf/93+X8eqrN1C2rP8vHTMmO1FRUZk3Q1myMAVB3fEo\ncrusOD9CNFGcXfV04YWx7N17ggYNKpKQ0JnWrasFIDBj/lS1alV27Njh87EBjMnN6RHufClEE0VF\n0tMzSEhYwowZWxk/vhtVq5bkp5/+SuPGF1CsWHigIzSGYsWK+XSUMWMCxa9XPYlIRxHZICKbReSs\n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\nsCIMAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x221882d4588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure()\n",
    "lw = 2\n",
    "plt.plot(fpr, tpr, color='darkorange',\n",
    "         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('ROC of Breast Cancer Prediction')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
